<?php

include_once 'Conexion.php';

class Grupo extends Conexion {
    
    public function listarGrupos ($restriccion) {
        
        $this->conectar();
        
        $result = $this->consultar("SELECT * FROM GRUPO JOIN CURSOTALLER ON (cutaIdCursoTaller=grIdCursoTaller) $restriccion ORDER BY grfecini");
        
        $this->desconectar();
        
        return $result;
    }
    
    public function obtenerPorId ($id) {
        $this->conectar();
        
        $result = $this->consultar("SELECT * FROM GRUPO JOIN CURSOTALLER ON (cutaIdCursoTaller = grIdCursoTaller) 
                                                    JOIN HORARIO ON (grIdGrupo = hoIdGrupo) WHERE grIdGrupo = $id");
        
        $this->desconectar();
        
        return $result[0];
    }
    
    public function registrar ($idCursoTaller, $fecIni, $fecFin, $minAlum, $sede, $lugar, $precio, $tipo, $comenExterno) {
        
        $this->conectar();
        
        $result = $this->insertar("INSERT INTO grupo(gridcursotaller, grfecini, grfecfin, gralummin, grdirsede, 
                                                        grlugsede, grprecio, grestado, grtipo, grcomentexterno, grconstancias) 
                                        VALUES ($idCursoTaller, '$fecIni', '$fecFin', $minAlum, '$sede', '$lugar', $precio, '0', '$tipo', '$comenExterno', 'N')", 
                                                    'grIdGrupo');
        
        $this->desconectar();
        
        return $result;
    }
    
    public function registrarProfesorModulo ($idGrupo, $idModulo, $idProfesor) {
        $this->conectar();
        
        $result = $this->insertar("INSERT INTO moduloprofesor(mopridmodulo, mopridprofesor, mopridgrupo, moprdircartacompro)
                                        VALUES ($idModulo, $idProfesor, $idGrupo, '')", 
                                                    'mopridmoduloprofesor');
        
        $this->desconectar();
        
        return $result;
    }
    
    public function modificarProfesorModulo ($idGrupo, $idModulo, $idProfesorNuevo) {
        $this->conectar();
        
        //Extraemos el IdModuloProfesor y la dirección de la cartacompriso (DirCartaCompro), usando el IdModulo y IdGrupo
        $moduloProfesor = $this->consultar("SELECT mopridmoduloprofesor, moprdircartacompro, mopridprofesor FROM MODULOPROFESOR WHERE moprIdModulo = $idModulo AND moprIdGrupo = $idGrupo");
        $moduloProfesor = $moduloProfesor[0];

	if ($moduloProfesor['mopridprofesor'] != $idProfesorNuevo) {
		( $moduloProfesor['moprdircartacompro'] != "" ? unlink("../docs/contratosProfe/$moduloProfesor[moprdircartacompro]") : "" );
		        
		$moduloProfesor = $moduloProfesor['mopridmoduloprofesor'];
		
		$return = $this->ejecutarQuery("UPDATE moduloprofesor SET mopridprofesor = $idProfesorNuevo, moprdircartacompro = '' 
		                                        WHERE moprIdModuloProfesor = $moduloProfesor");
	} else {
		$return = true;
	}
        
        $this->desconectar();
        
        return $return;
    }
    
    public function establecerServidorActividad ($idGrupo, $idActividad, $idServidor) {
        $this->conectar();
        
        $servdirActivi = $this->consultar("SELECT acseidactividadservidor FROM actividadservidor 
                                                        WHERE acseIdGrupo = $idGrupo AND acseIdActividadGrupo = $idActividad");
        
        //Si la consulta anterio regresa false, quiere decir que no hay registro de ese GRUPO y ACTIVIDAD
        if ($servdirActivi == false) {
            $result = $this->insertar("INSERT INTO actividadservidor(acseidactividadgrupo, acseidgrupo, acseidservidorsocial, acseestado) 
                                                    VALUES ($idActividad, $idGrupo, $idServidor, 'P')", 
                                                        'acseidactividadgrupo');
        } else {
            
            $servdirActivi = $servdirActivi[0];
            
            $result = $this->ejecutarQuery("UPDATE actividadservidor SET acseidservidorsocial = $idServidor 
                                                WHERE acseIdActividadservidor = $servdirActivi[acseidactividadservidor]");
        }
        
        $this->desconectar();
        
        return $result;
    }
    
    public function registrarContratoProfesorModulo ($id, $nombre) {
        $this->conectar();
        
        $result = $this->ejecutarQuery("UPDATE moduloprofesor SET moprdircartacompro = '$nombre' WHERE mopridmoduloprofesor = $id");
        
        $this->desconectar();
        
        return $result;
    }
    
    /* Lalo
     * Modifica los datos de la tabla grupo ($fecIni, $fecFin, $minAlum, $sede, $lugar, $precio, $tipo, $comenExterno) y los datos de la tabla horario ($horaIni, $horaFin, $dias)*/
    public function actualizar ($id, $fecIni, $fecFin, $minAlum, $sede, $lugar, $precio, $tipo, $comenExterno, $horaIni, $horaFin, $dias) {
        $this->conectar();
        
        $result = $this->ejecutarQuery("UPDATE grupo SET grfecini = '$fecIni', grfecfin = '$fecFin', gralummin = $minAlum, 
                                                        grdirsede = '$sede', grlugsede = '$lugar', grprecio = $precio, grtipo = '$tipo', grcomentexterno = '$comenExterno' 
                                                    WHERE gridgrupo = $id");
        
                $result = $this->ejecutarQuery("UPDATE horario SET hodia = '$dias', hohoraini = '$horaIni', hohorafin = '$horaFin'
                                                            WHERE hoidgrupo =  $id");
        
        $this->desconectar();
        
        return $result;
    }
    
    public function asignaProfesorEvalFinal ($idGrupo, $idProfesor) {
        $this->conectar();
        
        $result = $this->insertar("INSERT INTO profesorevalfinal (prefidprofesor, prefidgrupo) VALUES ($idProfesor, $idGrupo)", 
                                                    'prefidprofesorevalfinal');
        
        $this->desconectar();
        
        return $result;
    }
    
    public function desasignaProfesorEvalFinal ($idGrupo, $idProfesor) {
        $this->conectar();
        
        $result = $this->ejecutarQuery("DELETE FROM profesorevalfinal WHERE prefIdProfesor = $idProfesor AND prefIdGrupo = $idGrupo");
        
        $this->desconectar();
        
        return $result;
    }

    //Función para determinar si han cumplido todas las actividades de un estado determinado
    //  regresa TRUE si todas las actividades se han cumplido para ese estado
    //  regresa FALSE si aun hay actividades pendientes para cumplir ese estado
    // idGrupo: id del grupo cuyo estado se quiere saber
    // nivel: estado del grupo para el cual se quiere saber si ya se han cumplido todas las tareas
    public function isEstadoCompleto ($idGrupo, $nivel) {
        $this->conectar();
        
        $result = $this->consultar("(SELECT acgrIdActividadGrupo FROM actividadGrupo WHERE acgrNivelEstado = '$nivel') 
                                            EXCEPT 
                                        (SELECT acseIdActividadGrupo FROM actividadServidor JOIN actividadGrupo 
                                            ON (acseIdActividadGrupo = acgrIdActividadGrupo) 
                                                    WHERE acseIdGrupo = $idGrupo AND acseEstado = 'H' AND acgrNivelEstado = '$nivel')");
        
        $this->desconectar();
        
        if ($result == false) {
            return true;
        } else {
            return false;
        }
    }
    
    public function modificarEstado ($idGrupo, $nivelEstado) {
        $this->conectar();
        
        $result = $this->ejecutarQuery("UPDATE grupo SET grEstado = '$nivelEstado' WHERE grIdGrupo = $idGrupo");
        
        $this->desconectar();
        
        return $result;
    }
    
    //Función para determinar si han cumplido con el minimo de alumnos a determinado grupo
    //  regresa TRUE si el minimo de alumnos se ha cumplido o incluso superado
    //  regresa FALSE si aun no se cumple con el minimo de alumnos  
    // idGrupo: id del grupo cuyo estado de minimo de alumnos se quiere saber
    public function isMinimoAlumnosCumplido ($idGrupo) {
        
        $this->conectar();
        
        //Obtenemos el minimo de alumnos
        $result = $this->consultar("SELECT grAlumMin FROM grupo WHERE grIdGrupo = $idGrupo");
        $minimoDeAlum = $result[0]['gralummin'];
        
        $this->desconectar();
        
        //Obtenemos el total de evaluaciones que deben de realizarse
        $alumInscritos = $this->numAlumInscri($idGrupo);
        
        if ($minimoDeAlum <= $alumInscritos) {
            
            return true;
        } else {
            
            return false;
        }
    }
    
    //Función para determinar si un grupo ya tiene todas las cartas compromiso de los profesores asignados
    //  regresa TRUE si todos los profesores ya tienen una carta compromiso
    //  regresa FALSE si aun falta un(os) profesore(s) de carta compromiso
    // idGrupo: id del grupo cuyo estado de profesores con carta compromiso se quiere saber
    public function isProfesoresConCartaCompromiso ($idGrupo) {
        $this->conectar();
        
        $result = $this->consultar("SELECT moprDirCartaCompro FROM moduloProfesor WHERE moprIdGrupo = $idGrupo");
        
        $this->desconectar();
        
        foreach ($result as $dirCartaCompromiso) {
            
            if ($dirCartaCompromiso['moprdircartacompro'] == '') {
                return false;
            }
        }
        
        return true;
    }
    
    //Función para determinar si un grupo ya tiene todas las evaluaciones a los profesores
    //  regresa TRUE si todos los profesores ya estan evaluados
    //  regresa FALSE si aun falta un(os) profesore(s) por se evaluado
    // idGrupo: id del grupo cuyo estado de profesores evaluados
    public function isAlumnosYaEvaluaron ($idGrupo) {
        
        $this->conectar();
        
        //Obtenemos las evaluaciones ya hechas por parte de los alumnos
        $result = $this->consultar("SELECT count(*) FROM evaluacionProfesor JOIN moduloProfesor ON (evprIdModuloProfesor = moprIdModuloProfesor) 
                                        WHERE moprIdGrupo = $idGrupo");
        $evaluacionesRealizadas = $result[0]['count'];
        
        //Obtenemos el total de evaluaciones que deben de realizarse
        //Primero el total de modulos de ese grupo
        $result = $this->consultar("SELECT count(*) FROM grupo JOIN moduloProfesor ON (grIdGrupo = moprIdGrupo) WHERE grIdGrupo = $idGrupo");
        $totalModulos = $result[0]['count'];
        
        $this->desconectar();
        
        //Despues el total de inscritos al grupo
        $alumInscr = $this->numAlumInscri($idGrupo);
        $evaluacionesRequeridas = $alumInscr * $totalModulos;
        
        if ($evaluacionesRealizadas == $evaluacionesRequeridas) {
            return true;
        } else {
            return false;
        }
    }
    
    public function marcarConstanciasEntregadas ($idGrupo) {
        $this->conectar();
        
        $result = $this->ejecutarQuery("UPDATE grupo SET grconstancias = 'S' WHERE grIdGrupo = $idGrupo");
        
        $this->desconectar();
        
        return $result;
    }
    
    public function obtenerHorario ($idGrupo) {
        $this->conectar();
        
        $result = $this->consultar("SELECT horario.* FROM grupo JOIN horario ON (grIdGrupo = hoIdGrupo)
                                        WHERE grIdGrupo = $idGrupo");
        
        $this->desconectar();
        
        return $result[0];
    }
    
    public function numAlumInscri ($idGrupo) {
        
        $this->conectar();
        
        //Obtenemos el total de evaluaciones que deben de realizarse
        $result = $this->consultar("SELECT count(*) FROM inscripcion WHERE inIdGrupo = $idGrupo");
        $alumInscritos = $result[0]['count'];
        
        $this->desconectar();
        
        return $alumInscritos;
    }
    
    //Funcion para saber cuantos días tiene el curso
    public function totalDiasClases ($idGrupo) {
        $this->conectar();
        
        //Obtenemos el total de evaluaciones que deben de realizarse
        $result = $this->consultar("SELECT * FROM grupo JOIN horario ON (gridgrupo = hoidgrupo) WHERE gridgrupo = $idGrupo");
        $result = $result[0];
        
        $fecIni = date_create("$result[grfecini]");
        $fecFin = date_create("$result[grfecfin]");
        
        //Dias de la semana
        $diasSeman = explode("-", $result['hodia']);
        
        $totalDiasGrupo = 0;
        
        while ($fecIni <= $fecFin) {
            
            if ( in_array($this->diasALetras(date_format($fecIni, "D")), $diasSeman) ) {
                $totalDiasGrupo++;
            }
            
            date_add($fecIni, date_interval_create_from_date_string('1 days'));
        }
        
        $this->desconectar();
        //echo "<br><br>Total dias $totalDiasGrupo";
        return $totalDiasGrupo;
    }
    
    //Pasa de número de la semana a 3 primeras letras en ingles
    public function diasALetras ($dia) {
        
        switch ($dia) {
            case 'Mon': return "1";
                break;
            
            case 'Tue': return "2";
                break;
            
            case 'Wed': return "3";
                break;
            
            case 'Thu': return "4";
                break;
            
            case 'Fri': return "5";
                break;
            
            case 'Sat': return "6";
                break;
        }
    }
    
    public function numProfeReales ($idGrupo) {
        $this->conectar();
        
        $result = $this->consultar("SELECT DISTINCT mopridprofesor FROM moduloprofesor WHERE mopridgrupo = $idGrupo");
        
        $this->desconectar();
        
        return count($result);
    }
}
?>